package liecai_class.day07;

/**
 * Lock 锁机制 线程并发安全问题 synchronized
 *
 * synchronized的缺点:
 *  1.需要自己选定锁对象 - 麻烦！
 *  2.本质上是一个代码块，无法跨方法使用，因此无法实现在一个方法中加锁 而在另一个方法中解锁的操作
 *  3.本质上是一个代码块，无法提供更多的扩展能力
 *
 * 为了解决这些问题，JUC中提供Lock，来实现锁机制，用于替换synchronized
 */

/**
 * synchronized无法跨方法加锁解锁!
 */
public class Demo07 {
    private static boolean isServerOK = false;

    /**
     * 连接服务器
     */
    public static void netConn(){
        try {
            System.out.println("开始连接服务器...");
            while(!isServerOK) {
                Thread.sleep(1000);
                System.out.println("尝试重连...");
                //连不上服务器时，把锁释放掉，使程序能够继续执行后续操作
                //?????没法实现！
            }
            System.out.println("连接成功!");
        } catch (InterruptedException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (Demo07.class) {
                    System.out.println("AAAAA");
                    netConn();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (Demo07.class) {
                    System.out.println("CCCCC");
                    netConn();
                }
            }
        }).start();
    }
}
